home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / comm / uucp / AM114src.lha / uue.c < prev    next >
C/C++ Source or Header  |  1992-06-23  |  2KB  |  114 lines

  1. #include "am.h"
  2.  
  3. /*
  4.  * hack to metamail to decode uuencoded bodyparts
  5.  * Written by Keith Moore, February 1992
  6.  */
  7.  
  8. static void uueget (char *ptr,FILE *outfp,int n)
  9. {
  10.     unsigned char c1, c2, c3;
  11.     unsigned char p0, p1, p2, p3;
  12.  
  13.     p0 = (ptr[0] - ' ') & 0x3F;
  14.     p1 = (ptr[1] - ' ') & 0x3F;
  15.     p2 = (ptr[2] - ' ') & 0x3F;
  16.     p3 = (ptr[3] - ' ') & 0x3F;
  17.     
  18.     c1 = p0 << 2 | p1 >> 4;
  19.     c2 = p1 << 4 | p2 >> 2;
  20.     c3 = p2 << 6 | p3;
  21.  
  22.     if (n >= 1)
  23.     putc (c1, outfp);
  24.     if (n >= 2)
  25.     putc (c2, outfp);
  26.     if (n >= 3)
  27.     putc (c3, outfp);
  28. }
  29.  
  30.  
  31. static int getline (char *buf,int  size,FILE * fp)
  32. {
  33.     int c;
  34.     char *ptr = buf;
  35.  
  36.     for (c = 0; c < size; ++c)
  37.     buf[c] = ' ';
  38.     do {
  39.     c = getc (fp);
  40.     if (c == EOF) {
  41.         *ptr = '\0';
  42.         return (ptr == buf) ? -1 : 0;
  43.     }
  44.     else if (c == '\n' || c == '\r') {
  45.         *ptr = '\0';
  46.         return 0;
  47.     }
  48.     else if (ptr == buf && c == '>') /* ">From" line hack */
  49.         continue;
  50.     else if (size > 0) {
  51.         *ptr++ = c;
  52.         size--;
  53.     }
  54.     } while (1);
  55.     return(0); /* shut lint up */
  56. }
  57.  
  58.  
  59. void fromuue (FILE *infp,FILE *outfp,char **boundaries,int *ctptr)
  60. {
  61.     char buf[63];
  62.  
  63.     while (1) {
  64.     if (getline (buf, sizeof buf, infp) < 0) {
  65.         fprintf (stderr, "Premature EOF!\n");
  66.         return;
  67.     }
  68.     if (strncmp (buf, "begin", 5) == 0)
  69.         break;
  70.     else if (buf[0] == '-' && buf[1] == '-') {
  71.         if (boundaries && PendingBoundary (buf, boundaries, ctptr))
  72.         return;
  73.     }
  74.     }    
  75.     while (1) {
  76.     if (getline (buf, sizeof buf, infp) < 0) {
  77.         fprintf (stderr, "Premature EOF!\n");
  78.         return;
  79.     }
  80.     else if (strncmp (buf, "end", 5) == 0)
  81.         break;
  82.     else if (buf[0] == '-' && buf[1] == '-') {
  83.         if (boundaries && PendingBoundary (buf, boundaries, ctptr)) {
  84.         fprintf (stderr, "premature end of x-uue body part\n");
  85.         return;
  86.         }
  87.         else {
  88.         fprintf (stderr, "ignoring invalid boundary marker\n");
  89.         continue;
  90.         }
  91.     }
  92.     else {
  93.         int length = (*buf - ' ');
  94.         if (*buf == '`')
  95.         length = 0;
  96.         if (length < 0 || length > 63) {
  97.         fprintf (stderr, "fromuue: illegal length (%d)\n",
  98.              length);
  99.         }
  100.         else if (length == 0)
  101.         break;
  102.         else {
  103.         char *ptr = buf + 1;
  104.         while (length > 0) {
  105.             uueget (ptr, outfp, length);
  106.             length -= 3;
  107.             ptr += 4;
  108.         }
  109.         }
  110.     }
  111.     }
  112. }
  113.  
  114.